<?php

// 框架中对于换行符的定义，HH是`换行`中文拼音huan hang的头字母缩写
define('HH', PHP_EOL);
// 框架中对于浏览器中网页换行的定义
define('BR', "<br/>");
// 本地服务器常用关键词, 是Local Server头字母缩写
define('LS', array("127.0.0.1", "localhost", "192.168.", '.test'));
define('__DIR__', dirname(__FILE__));
define('DS', DIRECTORY_SEPARATOR);

/**
 * 加载常用函数库
 */
require_once("core/include/common.php");

//加载枚举类型定义
class_exists('Enum') || require(__DIR__ . '/core/Enum.php');

/**
 * -----------| 定义全局使用变量 |-----------
 * @access public
 */
class Gc
{
    //<editor-fold desc='网站使用设置'>
    /**
     * 数据库配置
     * @var array
     * @static
     */
    public static $database_config = array(
        'db_type'  => 0,//默认使用mysql数据库. EnumDbSource::DB_MYSQL=0, 具体定义参见ConfigDb.php里EnumDbSource的定义
        'driver'   => 1,//数据库使用调用引擎. EnumDbEngine::ENGINE_OBJECT_MYSQL_MYSQLI, 具体定义参见ConfigDb.php里EnumDbEngine的定义
        'host'     => '127.0.0.1',//数据库主机[默认本地 localhost]
        // 'host'     => 'mysql',//数据库主机[docker mysql host]
        'port'     => '',//数据库端口
        'database' => 'bb',//数据库名称
        'username' => 'root',//数据库用户名
        'password' => 'root',//数据库密码
        'prefix'   => 'bb_',//数据库表名前缀
        'debug'    => true//记录日志:数据库sql查询语句
    );

    /**
     * 是否打开Debug模式
     * @var bool
     * @static
     */
    public static $dev_debug_on    = true;
    /**
     * 是否开放php提供的debug信息
     * @var bool
     * @static
     */
    public static $dev_php_debug_on = false;
    /**
     * 网站应用的名称
     *
     * 展示给网站用户
     * @var string
     * @static
     */
    public static $site_name = 'bb';
    /**
     * 网站应用的版本
     */
    public static $version   = '1.0.0';
    /**
     * 网站根路径的URL路径
     * @var string
     * @static
     */
    public static $url_base;//='http://localhost/bb/';//获取网站URL根路径
    /**
     * 网站根路径的物理路径
     * @var string
     * @static
     */
    public static $nav_root_path;//='C:\\wamp\\www\\bb\\';
    /**
     * 框架文件所在的路径
     * 有两种策略可以部署
     * 1.框架和应用整合在一起；则路径同$nav_root_path
     * 2.框架和应用分开，在php.ini里设置include_path='';添加框架所在的路径
     *                   则可以直接通过
     * @var string
     * @static
     */
    public static $nav_framework_path;//='C:\\wamp\\www\\bb\\';
    /**
     * 上传或者下载文件的路径
     *
     * @var mixed
     */
    public static $attachment_path;//='C:\\wamp\\www\\bb\\attachment\\';
    /**
     * 上传或者下载文件的网络路径
     *
     * @var mixed
     */
    public static $attachment_url;//='http://localhost/bb/upload/attachment/';
    /**
     * 上传图片的网络路径
     *
     * @var mixed
     */
    public static $upload_url;//='http://localhost/bb/upload/';
    /**
     * 上传图片的路径
     *
     * @var mixed
     */
    public static $uploadImg_url; // = 'http://localhost/bb/upload/images/';
    /**
     * 上传图片的路径
     *
     * @var mixed
     */
    public static $upload_path;//='C:\\wamp\\www\\bb\\upload\\';
    //</editor-fold>

    //<editor-fold desc='开发者使用设置'>
    /**
     * 网站应用的名称
     *
     * 在网站运行程序中使用，不展示给网站用户；如标识日志文件的默认名称等等。
     *
     * @var string
     * @static
     */
    public static $appName       = 'bb';
    /**
     * 应用名的缩写
     */
    public static $appName_alias = 'bb';
    /**
     * 业务应用部署的根目录
     *
     * 说明: 该框架采用模块组建的方式
     *
     * 每一个遵循该框架的网站业务应用都部署在该目录下
     *
     * @var string
     * @static
     */
    public static $module_root   = 'home';
    /**
     * 开发者可在同一个web里部署多个业务应用
     *
     * $moduleName里定义的是每个业务应用所在的根目录路径
     * @var array
     * @static
     */
    public static $module_names  = array(
        "bb",
        "admin"
    );
    /**
     * 是否要Profile网站性能
     * @var bool
     * @static
     */
    public static $dev_profile_on = false;
    /**
     * 页面字符集
     *
     * @string 页面字符集
     *
     * 一般分为:
     *
     *    - UTF-8
     *    - GBK
     *
     * 最终可以由用户选择
     * @var string
     * @static
     */
    public static $encoding = 'UTF-8';
    /**
     * Web开发使用语言
     *
     *     - En_Us: 英文
     *     - Zh_Cn: 中文
     *
     * 默认使用中文
     *
     * @var string 文字显示默认语言
     * @static
     *
     * 最终可以由用户选择
     */
    public static $language = 'Zh_Cn';
    /**
     * 是否Session自动启动
     *
     * @var bool
     * @static
     */
    public static $session_auto_start = true;
    /**
     * 通常用于用邮件发送重要日志给管理员
     *
     * @var array 邮件的配置。
     * @static
     */
    //<editor-fold defaultstate='collapsed' desc='邮件的设置'>
    public static $email_config = array(
        'SMTP'          => 'smtp.sina.com.cn',
        'smtp_port'     => '25',
        'sendmail_from' => 'skygreen2001@sina.com',
        /**
         * 可在php.ini中设置sendmail_path，无法通过ini_set实时设置，因为它只能在php.ini或者httpd.conf中设置。
         *
         * 因为官网文档【http://php.net/manual/en/mail.configuration.php】: sendmail_path '/usr/sbin/sendmail -t -i' PHP_INI_SYSTEM
         */
        //'sendmail_path'=>'C:\wamp\sendmail\sendmail.exe -t',
        /**
         * 通过邮件发送日志的目的者
         */
        'mailto' => 'skygreen_2001@sina.com'
    );
    //</editor-fold>
    /**
     * 日志的配置
     *
     * @var array 日志的配置。
     * @static
     */
    //<editor-fold defaultstate='collapsed' desc='日志的设置'>
    public static $log_config = array(
        /**
         * 默认日志记录的方式。
         *
         * 一般来讲，日志都通过log记录，由本配置决定它在哪里打印出来。
         *
         * 可通过邮件发送重要日志，可在数据库或者文件中记录日志。也可以通过Firebug显示日志。
         *
         * EnumLogType::FILE : 3
         */
        'logType'          => EnumLogType::FILE,
        /**
         * 允许记录的日志级别
         */
        'log_record_level' => array('EMERG','ALERT','CRIT','ERR','INFO'),
        /**
         * 日志文件路径
         *
         * 可指定日志文件放置的路径
         *
         * 如果为空不设置，则在网站应用根目录下新建一个log目录，放置在它下面
         */
        'logpath'       => '',
        /**
         * 检测日志文件大小，超过配置大小则备份日志文件重新生成，单位为字节
         */
        'logFile_size' => 1024000000,
        /**
         * 日志记录的时间格式
         */
        'timeFormat'    => '%Y-%m-%d %H:%M:%S',
        /**
         * 通过邮件发送日志的配置。
         */
        'config_mail_log' => array(
            'subject'     => '重要的日志事件',
            'mailBackend' => '',
        ),
        'log_table' => 'bb_log_log',
    );
    //</editor-fold>
    //</editor-fold>

    /**
     * 无需配置自动注入网站的网络地址和物理地址。
     */
    //<editor-fold defaultstate='collapsed' desc='初始化设置'>
    public static $is_port = true;
    public static function init()
    {
        if (empty(Gc::$nav_root_path)) {
            Gc::$nav_root_path = __DIR__ . DS;
        }
        if (empty(Gc::$nav_framework_path)) {
            Gc::$nav_framework_path = __DIR__ . DS;
        }
        if (empty(Gc::$upload_path)) {
            Gc::$upload_path = Gc::$nav_root_path . 'upload' . DS;
        }
        if (empty(Gc::$attachment_path)) {
            Gc::$attachment_path = Gc::$upload_path . 'attachment' . DS;
        }
        if (empty(Gc::$url_base)) {
            $baseurl = '';
            if (empty($_SERVER['SERVER_NAME'])) {
                $_SERVER['SERVER_NAME'] = "localhost";
            }
            if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')) {
                $baseurl = 'https://' . $_SERVER['SERVER_NAME'];
                if (self::$is_port && ($_SERVER['SERVER_PORT'] != 443)) {
                    $baseurl .= ':' . $_SERVER['SERVER_PORT'];
                }
            } else {
                if (array_key_exists('SERVER_NAME', $_SERVER)) {
                    $baseurl = 'http://' . $_SERVER['SERVER_NAME'];
                }
                if (array_key_exists('SERVER_PORT', $_SERVER)) {
                    if (strpos($_SERVER['HTTP_HOST'], $_SERVER['SERVER_PORT']) !== false) {
                        if (self::$is_port && $_SERVER['SERVER_PORT'] != 80) {
                            $baseurl .= ':' . $_SERVER['SERVER_PORT'];
                        }
                    }
                }
            }
            $baseDir = dirname($_SERVER['SCRIPT_NAME']);
            $baseurl .= ($baseDir == '\\' ? '' : $baseDir);
            if (strpos(strrev($baseurl), "/") !== 0) {
                $baseurl .= '/';
            }
            $file_sub_dir = str_replace(Gc::$nav_root_path, "", getcwd() . DS);
            $file_sub_dir = str_replace(DS, "/", $file_sub_dir);
            Gc::$url_base = str_replace(strtolower($file_sub_dir), "", strtolower($baseurl));
        }
        if (empty(Gc::$upload_url)) {
            Gc::$upload_url = Gc::$url_base;
            $same_part = explode(DS, Gc::$nav_root_path);
            if ($same_part && (count($same_part) > 2)) {
                $same_part = $same_part[count($same_part) - 2];
                if (strpos(strtolower(Gc::$upload_url), "/" . strtolower($same_part) . "/") !== false) {
                    Gc::$upload_url = substr(Gc::$upload_url, 0, (strrpos(Gc::$upload_url, $same_part . "/") + strlen($same_part) + 1)) . "upload/";
                } else {
                    $parse_url = parse_url(Gc::$upload_url);
                    if (array_key_exists("scheme", $parse_url)) {
                        if ($parse_url) {
                            Gc::$upload_url = $parse_url["scheme"] . "://" . $parse_url["host"];
                        }
                        if (self::$is_port && !empty($parse_url["port"])) {
                            Gc::$upload_url .= ":" . $parse_url["port"];
                        }
                    }
                    Gc::$upload_url .= "/upload/";
                }
            }
        }
        if (empty(Gc::$attachment_url)) {
            Gc::$attachment_url = Gc::$upload_url . 'attachment/';
        }
        if (empty(Gc::$uploadImg_url)) {
            Gc::$uploadImg_url = Gc::$upload_url . 'images/';
        }
    }
    //</editor-fold>
}

//<editor-fold defaultstate='collapsed' desc='邮件在php.ini里全局的设置'>
ini_set('SMTP', Gc::$email_config['SMTP']);
ini_set('smtp_port', Gc::$email_config['smtp_port']);
ini_set('sendmail_from', Gc::$email_config['sendmail_from']);
//</editor-fold>

Gc::init();
